﻿/*
 * The MIT License (MIT)
 * Copyright (c) 2012 @donkeysharp
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
 * and associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
 * is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies 
 * or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE 
 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace DonkeyCleaner.Core {
    public class Updater {
        private string HashDatabaseUrl { get; set; }

        /// <summary>
        /// Initializes an instance of Updater class
        /// </summary>
        public Updater() {
            // HashDatabaseUrl = "https://dl.dropbox.com/u/50103457/Hashes.xml";
            HashDatabaseUrl = "http://localhost/Hashes.xml";
        }
        /// <summary>
        /// Reads internet hashes database and updates local
        /// database
        /// </summary>
        /// <returns>True if database has been updated</returns>
        public bool UpdateDatabase() {
            bool result = false;
            try {
                XDocument doc = XDocument.Load(HashDatabaseUrl);
                // Parses xml into a generic list of Malware objects
                var query = (from file in doc.Descendants("file")
                            select new Malware() { 
                                MD5Sum = file.Element("md5").Value,
                                Name = file.Element("name").Value,
                                Size = Convert.ToInt64(file.Element("size").Value)
                            }).ToList<Malware>();

                // Try to insert malware into database
                foreach(var item in query) {
                    try {
                        MalwareDatabase.Current.AddMalware(item);
                    }
                    catch (Exception ex) {
                        Logging.Logger.SaveLogMessage(Logging.LogType.UpdateError, "Error adding malware into database.  Exception: " + ex.Message);
                    }
                }
                result = true;
            }
            catch (Exception ex) {
                Logging.Logger.SaveLogMessage(Logging.LogType.UpdateError, "Error retrieving malware hash database.  Exception: " + ex.Message);
            }

            return result;
        }
    }
}
